/**
* 计算下面的表达式
          [n                    (m=1)
f(m,n) =  |m                    (n=1)
          [f(m-1,n) + f(m,n-1)  (m>1,n>1)
**/
#include <stdio.h>

/**
* 递归写法
* 没啥好说的
**/
int f0(int m, int n)
{
  if (m == 1) {
    return n;
  }
  if (n == 1) {
    return m;
  }
  return f0(m-1,n) + f0(m,n-1);
}

/**
* 非递归
* 0~m行,0~n列,边上为1,2,3...的递增数
* 1,1到m,n的数均为左边加上边的值
*/
int f1(int m, int n)
{
  int i,j, a[100][100];
  for (i = 0;i != m;i++) {
    a[i][0] = i+1; // 初始行边
  }
  for (i = 0;i != n;i++) {
    a[0][i] = i+1; // 初始列边
  }
  for (i = 1;i != m;i++) {
    for (j = 1;j != n;j++) {
      a[i][j] = a[i-1][j] + a[i][j-1]; // 每个点为左边加上边的值
    }
  }
  return a[m-1][n-1];
}

int main(int argc, char *argv[])
{
  int m = 11, n = 10;
  printf("f0:%d\n", f0(m,n));
  printf("f1:%d\n", f1(m,n));
  return 0;
}
